package controlador;

import vista.InterfazGraficaIngrediente;
import vista.Mensaje;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import modelo.Ingrediente;
import modelo.IngredienteDao;

public class ControladorIngrediente extends ControladorActualizadorBD implements ActionListener,WindowListener,FocusListener,KeyListener
{
	private enum MoverRegistro {PRIMERO,ATRAS,SIGUIENTE,ULTIMO};
	
	private InterfazGraficaIngrediente interfazGrafica;
	private ControladorPrincipal controladorPrincipal;
	private ArrayList<Ingrediente> ingredientes;
    private IngredienteDao ingredienteDao;
    private int i;
    private boolean guardando;
	
	public ControladorIngrediente(ControladorPrincipal controladorPrincipal)
	{
		this.controladorPrincipal= controladorPrincipal;
		
		interfazGrafica= new InterfazGraficaIngrediente();
		
        ingredienteDao= new IngredienteDao();
		
		ingredientes= new ArrayList<Ingrediente>();
		i= 0;
		guardando=false;
		
		interfazGrafica.addListener((WindowListener) this);
		interfazGrafica.addListener((ActionListener) this);
		interfazGrafica.addListener((FocusListener) this);
		interfazGrafica.addListener((KeyListener) this);
		interfazGrafica.visualizarVentana();
	}
	
	private void moverRegistro(MoverRegistro enumMR)
	{
	
		if (ingredientes.size()>0)
		{ 	 
			switch(enumMR)
			{
			  case PRIMERO:
			  {
		        i = 0;
			    break;
			  }
			  case ATRAS:
			  {
				 i -= 1;  
			     if (i<0)
			    	 i= ingredientes.size()-1;
			     
			     break;
			  }
			  case SIGUIENTE:
			  {
				  i= (i + 1) % ingredientes.size();
				   break; 
			  }
			  case ULTIMO:
			  {
				  i= ingredientes.size() - 1;
				  break;  
			  }
			}
			actualizarVentana(ingredientes.get(i));
		}		
	}
	

	private void actualizarVentana(Ingrediente ingrediente)
	{
		if (ingrediente!=null)
		{
		   interfazGrafica.actualizarInfo(ingrediente.getCodigo(),ingrediente.getNombreCorto(),ingrediente.getNombreLargo(),ingrediente.getUnidadMedida(),ingrediente.getCosto(),ingrediente.getExistencia());
		}		
	}

	@Override
	public void windowOpened(WindowEvent arg0) 
	{
		inicializarInfo();
	}
	
	@Override
	public void windowClosing(WindowEvent arg0) 
	{
		interfazGrafica.descargarMemoria();
		controladorPrincipal.visualizarVentanaPrincipal();
		
	}

	
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		
		if (e.getSource() instanceof javax.swing.JButton)
		{
			if (e.getActionCommand().equalsIgnoreCase("Siguiente"))
				moverRegistro(MoverRegistro.SIGUIENTE);
			else if (e.getActionCommand().equalsIgnoreCase("Ultimo"))
				moverRegistro(MoverRegistro.ULTIMO);
			else if (e.getActionCommand().equalsIgnoreCase("Atras"))
				moverRegistro(MoverRegistro.ATRAS);
			else if (e.getActionCommand().equalsIgnoreCase("Primero"))
				moverRegistro(MoverRegistro.PRIMERO);
			else if (e.getActionCommand().equalsIgnoreCase("Guardar"))
				guardar();
			else if(e.getActionCommand().equalsIgnoreCase("Modificar"))
				modificar();
			else if(e.getActionCommand().equalsIgnoreCase("Eliminar"))
				eliminar();
			else if (e.getActionCommand().equalsIgnoreCase("Cancelar"))
			{
				inicializarInfo();
			}		
			else if (e.getActionCommand().equalsIgnoreCase("Salir"))
			{
				 controladorPrincipal.visualizarVentanaPrincipal();
				 interfazGrafica.descargarMemoria();
			}		
		
		}		
		
	}
	
	@Override
	protected Ingrediente getObjecto() 
	{
		Ingrediente ingrediente= new Ingrediente(interfazGrafica.getCodIngrediente(),interfazGrafica.getNombreCorto(),interfazGrafica.getNombreLargo(),interfazGrafica.getUnidadMedida(),interfazGrafica.getCosto(),interfazGrafica.getExistencia());
		
		return ingrediente;
	}

	@Override
	protected boolean isValido(Object objeto) 
	{
		boolean valido=false;
		
		if (objeto instanceof Ingrediente)
		{
		   Ingrediente ingrediente= (Ingrediente) objeto;
		   valido= ingrediente.validar();
		}
		
		return valido;
	}

	@Override
	protected boolean isExiste(Object objeto) throws Exception 
	{
		boolean existe= false;
		
		if (objeto instanceof Ingrediente)
		{
			Ingrediente ingrediente= (Ingrediente) objeto;
			existe= ingredienteDao.consultarIngrediente(ingrediente);
		}
		
		return existe;
	}
	

	@Override
	protected boolean isEliminado(Object objeto) throws Exception {
		boolean eliminado= false;
		
		if (objeto instanceof Ingrediente)
		{
			Ingrediente ingrediente= (Ingrediente) objeto;
			eliminado=ingredienteDao.isEliminado(ingrediente);
		}
		
		return eliminado;
	}

	@Override
	protected boolean activarObjeto(Object objeto) throws Exception {
		boolean activado= false;
		
		if (objeto instanceof Ingrediente)
		{
			Ingrediente ingrediente= (Ingrediente) objeto;
			activado= ingredienteDao.activarIngrediente(ingrediente);
		}
		
		return activado;
	}

	@Override
	protected boolean registrarObjeto(Object objeto) throws Exception {
		boolean registrado= false;
		
		if (objeto instanceof Ingrediente)
		{
			Ingrediente ingrediente= (Ingrediente) objeto;
			registrado= ingredienteDao.registrarIngrediente(ingrediente);
		}
		
		return registrado;
	}

	@Override
	protected boolean actualizarObjeto(Object objeto) throws Exception {
		boolean actualizado= false;
		
		if (objeto instanceof Ingrediente)
		{
			Ingrediente ingrediente= (Ingrediente) objeto;
			actualizado= ingredienteDao.actualizarIngrediente(ingrediente);
		}
		
		return actualizado;
	}

	@Override
	protected boolean eliminarObjeto(Object objeto) throws Exception 
	{
		boolean eliminado= false;
		
		if (objeto instanceof Ingrediente)
		{
			Ingrediente ingrediente= (Ingrediente) objeto;
			eliminado= ingredienteDao.eliminarIngrediente(ingrediente);
		}
		
		return eliminado;
	}

	@Override
	protected boolean isDependiente(Object objeto) throws Exception {
		boolean dependiente=false;
		
		if (objeto instanceof Ingrediente)
		{
			Ingrediente ingrediente= (Ingrediente) objeto;
			dependiente= ingredienteDao.isDependiente(ingrediente);
		}
		
		return dependiente;
	}

	@Override
	protected void inicializarInfo() 
	{
		try
		{
		  if (!ingredientes.isEmpty())	
			ingredientes.clear();
		  
		  ingredientes.addAll(ingredienteDao.consultarIngredientesActivos());
		  moverRegistro(MoverRegistro.PRIMERO);
		  
		  
		  if (!ingredientes.isEmpty())
		  {
				interfazGrafica.deshabilitarBotonActualizar("Guardar");
				interfazGrafica.habilitarBotonActualizar("Eliminar");
				interfazGrafica.deshabilitarBotonActualizar("Cancelar");
				interfazGrafica.habilitarNavegacion();
		  }
		  else
		  {
			    interfazGrafica.habilitarBotonActualizar("Guardar");
			    interfazGrafica.deshabilitarBotonActualizar("Eliminar");
			    interfazGrafica.habilitarBotonActualizar("Cancelar");
			    interfazGrafica.deshabilitarNavegacion();
		   }		
			
		  interfazGrafica.deshabilitarBotonActualizar("Modificar");
		  guardando=false;
		  
		}
		catch(Exception e)
		{
			Mensaje.mostrarError(e.getMessage());
			controladorPrincipal.visualizarVentanaPrincipal();
			interfazGrafica.descargarMemoria();
		}
		
	}
	
	@Override
	public void focusLost(FocusEvent evt) 
	{
		if (evt.getSource() instanceof javax.swing.JTextField)
		{
			
			Ingrediente ingrediente= new Ingrediente(interfazGrafica.getCodIngrediente(),"","","",0.0,0.0);
			
			try
			{
			  
			  /*Actualiza el ArrayList con la base de datos*/
			  if (!ingredientes.containsAll(ingredienteDao.consultarIngredientesActivos()))
			  {
				  if (!ingredientes.isEmpty())	
						ingredientes.clear();
					  
				  ingredientes.addAll(ingredienteDao.consultarIngredientesActivos());
			  } 
			 /********************************************/
			 	
			  if (ingredientes.contains(ingrediente))
			  {
				 i= ingredientes.indexOf(ingrediente); 
				 actualizarVentana(ingredientes.get(i));
				 interfazGrafica.deshabilitarBotonActualizar("Guardar");
				 interfazGrafica.habilitarBotonActualizar("Eliminar");
				 interfazGrafica.deshabilitarBotonActualizar("Modificar");
				 interfazGrafica.deshabilitarBotonActualizar("Cancelar");
				 
				 interfazGrafica.habilitarNavegacion();
				 guardando=false;
				 
			  }
			  else
			  {
				 interfazGrafica.limpiarTextos();
				 interfazGrafica.habilitarBotonActualizar("Guardar");
				 interfazGrafica.habilitarBotonActualizar("Cancelar");
				 interfazGrafica.deshabilitarBotonActualizar("Modificar");
				 interfazGrafica.deshabilitarBotonActualizar("Eliminar");
				 interfazGrafica.deshabilitarNavegacion();
				 guardando= true;
			  }
			  
			  
			}
			catch(Exception e)
			{
				Mensaje.mostrarError(e.getMessage());
			}
			
		}
		
	}
	
	
	@Override
	public void keyTyped(KeyEvent evt) 
	{

		if (evt.getSource() instanceof javax.swing.text.JTextComponent)
		{
			javax.swing.text.JTextComponent txt= (javax.swing.text.JTextComponent) evt.getSource();
			
			if (txt.getName().equalsIgnoreCase("txtCodigo"))
			{				
			   if (interfazGrafica.getCodIngrediente().length()==Ingrediente.MAXCODIGO)
					evt.setKeyChar(Character.MIN_VALUE);
				
			}
			else if ((txt.getName().equalsIgnoreCase("txtNombreCorto")))
			{
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && (Character.isDigit(evt.getKeyChar()) || interfazGrafica.getNombreCorto().length()==Ingrediente.MAXNOMBRECORTO))
					evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					if (guardando)
					{
						interfazGrafica.habilitarBotonActualizar("Guardar");
						interfazGrafica.deshabilitarBotonActualizar("Modificar");
						interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
				    	interfazGrafica.deshabilitarBotonActualizar("Guardar");
				    	interfazGrafica.habilitarBotonActualizar("Modificar");
				    	interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
					interfazGrafica.habilitarBotonActualizar("Cancelar");
				}
			}
			else if (txt.getName().equalsIgnoreCase("txtNombreLargo"))
			{
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && (Character.isDigit(evt.getKeyChar()) || interfazGrafica.getNombreCorto().length()==Ingrediente.MAXNOMBRELARGO))
					evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					if (guardando)
					{
						interfazGrafica.habilitarBotonActualizar("Guardar");
						interfazGrafica.deshabilitarBotonActualizar("Modificar");
						interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
				    	interfazGrafica.deshabilitarBotonActualizar("Guardar");
				    	interfazGrafica.habilitarBotonActualizar("Modificar");
				    	interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
					interfazGrafica.habilitarBotonActualizar("Cancelar");
				}
			}
			else if ((txt.getName().equalsIgnoreCase("txtCosto")))
			{
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && !Character.isDigit(evt.getKeyChar()) && '.'!=evt.getKeyChar())
					evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					if (guardando)
					{
						interfazGrafica.habilitarBotonActualizar("Guardar");
						interfazGrafica.deshabilitarBotonActualizar("Modificar");
						interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
				    	interfazGrafica.deshabilitarBotonActualizar("Guardar");
				    	interfazGrafica.habilitarBotonActualizar("Modificar");
				    	interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
					interfazGrafica.habilitarBotonActualizar("Cancelar");
				}
			}
			else if (txt.getName().equalsIgnoreCase("txtUnidadMedida"))
			{		
				if ((char)KeyEvent.VK_BACK_SPACE!= evt.getKeyChar() && (Character.isDigit(evt.getKeyChar()) || interfazGrafica.getUnidadMedida().length()==Ingrediente.MAXUNID))
			         evt.setKeyChar(Character.MIN_VALUE);
				else
				{
					
					if (guardando)
					{
						interfazGrafica.habilitarBotonActualizar("Guardar");
						interfazGrafica.deshabilitarBotonActualizar("Modificar");
						interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
				    else
					{
				    	interfazGrafica.deshabilitarBotonActualizar("Guardar");
				    	interfazGrafica.habilitarBotonActualizar("Modificar");
				    	interfazGrafica.deshabilitarBotonActualizar("Eliminar");
					}
					interfazGrafica.habilitarBotonActualizar("Cancelar");
				}
				
			}
			
		}
		
		
	}


	
	/***Metodos No implementados****/
	@Override
	public void windowActivated(WindowEvent arg0) {}

	@Override
	public void windowClosed(WindowEvent arg0) {}
	
	@Override
	public void windowDeactivated(WindowEvent arg0) {}

	@Override
	public void windowDeiconified(WindowEvent arg0) {}

	@Override
	public void windowIconified(WindowEvent arg0) {}

	@Override
	public void focusGained(FocusEvent arg0) {}

	@Override
	public void keyPressed(KeyEvent arg0) {}

	@Override
	public void keyReleased(KeyEvent arg0) {}
	
	/******************************/
  
	
}
